#创建高度交互式的动画绘图
# 导入所需的库
import numpy as np
import matplotlib.pyplot as plt
import animatplot as amp

# 创建了一些坐标轴上的点
x = np.linspace(-2, 2, 41)
y = np.linspace(-2, 2, 41)
t = np.linspace(0, 2*np.pi, 30)
X, Y, T = np.meshgrid(x, y, t)

# 使用生成的坐标点，计算
data = np.sin(X*X+Y*Y-T)
line_data = data[20,:,:]

# 创建包含两个子图的图形窗口，并设置各种图形的属性，如坐标轴便签、标题等
fig, (ax1, ax2) = plt.subplots(1, 2)
for ax in [ax1, ax2]:
    ax.set_aspect('equal')
    ax.set_xlabel('x')
ax2.set_ylabel('y', labelpad=-5)
ax1.set_ylabel('z')
ax1.set_ylim([-1.1,1.1])
fig.suptitle('Multiple blocks')
ax1.set_title('Cross Section: $y=0$')
ax2.set_title(r'$z=\sin(x^2+y^2-t)$')

# 创建两个block对象
# Line块用于绘制一条线，Pcolormesh块用于绘制一个伪彩色网格
line_block = amp.blocks.Line(X[0,:,:], line_data,
                             ax=ax1, t_axis=1)
block = amp.blocks.Pcolormesh(X[:,:,0], Y[:,:,0], data, ax=ax2, t_axis=2, vmin=-1, vmax=1)

# 添加颜色条，用于显示伪彩色网格的颜色映射。
plt.colorbar(block.quad)
# 创建时间轴对象，再使用Animation类将块和时间轴对象组合成一个动画
timeline = amp.Timeline(t, fps=10)
anim = amp.Animation([block, line_block], timeline)

# 添加用户界面控制动画的小部件
anim.controls()
# 显示动画窗口
plt.show()